Passed
Push — master ( b0b32f...422b7e )
by EMP
01:40
created

main.js ➔ addCellbox   A

Complexity

Conditions 1

Size

Total Lines 7
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 6
dl 0
loc 7
rs 10
c 0
b 0
f 0
1
"use strict";
2
3
sodium.ready.then(function() {
4
5
const ae = new AllEars(function(ok) {
6
	if (ok) {
7
		document.getElementById("btn_enter").disabled = false;
8
	} else {
9
		document.getElementById("begin_message").hidden = false;
10
		document.getElementById("begin_message").textContent = "Failed init";
11
	}
12
});
13
14
let page=0;
15
16
function navMenu(num) {
17
	document.getElementById("div_readmsg").hidden = true;
18
19
	const b = document.getElementsByTagName("nav")[0].getElementsByTagName("button");
20
	const d = document.getElementsByClassName("maindiv");
21
22
	for (let i = 0; i < 5; i++) {
23
		if (i === num) {
24
			b[i].disabled = true;
25
			d[i].hidden = false;
26
		} else {
27
			b[i].disabled = false;
28
			d[i].hidden = true;
29
		}
30
	}
31
}
32
33
function getCountryFlag(countryCode) {
34
	return sodium.to_string(new Uint8Array([
35
		240, 159, 135, 166 + countryCode.codePointAt(0) - 65,
36
		240, 159, 135, 166 + countryCode.codePointAt(1) - 65
37
	]));
38
}
39
40
function deleteButtonShow(show) {
41
	if (show) {
42
		document.getElementById("btn_msgdel").hidden = false;
43
		return;
44
	}
45
46
	const checkboxes = document.getElementById("tbd_inbox").getElementsByTagName("input");
47
	let checked = false;
48
49
	for (let j = 0; j < checkboxes.length; j++) {
50
		if (checkboxes[j].checked) {
51
			checked = true;
52
			break;
53
		}
54
	}
55
56
	document.getElementById("btn_msgdel").hidden = !checked;
57
}
58
59
function addIntMessage(i) {
60
	const tbl = document.getElementById("tbd_inbox");
61
	const row = tbl.insertRow(-1);
62
63
	const ts = ae.getIntMsgTime(i);
64
	let cell = row.insertCell(-1);
65
	cell.setAttribute("data-ts", ts);
66
	cell.textContent = new Date(ts * 1000).toISOString().slice(0, 16).replace("T", " ");
67
	cell.className = "mono";
68
69
	cell = row.insertCell(-1);
70
	cell.textContent = ae.getIntMsgTitle(i);
71
	cell.onclick = function() {
72
		navMenu(-1);
73
		document.getElementById("div_readmsg").hidden = false;
74
		document.getElementById("readmsg_head").hidden = false;
75
		document.getElementById("readmsg_levelinfo").hidden = false;
76
		document.getElementById("readmsg_extmsg").hidden = true;
77
78
		document.getElementById("readmsg_title").textContent = ae.getIntMsgTitle(i);
79
		document.getElementById("readmsg_from").textContent  = ae.getIntMsgFrom(i);
80
		document.getElementById("readmsg_to").textContent    = ae.getIntMsgTo(i);
81
		document.getElementById("readmsg_body").textContent  = ae.getIntMsgBody(i);
82
		document.getElementById("readmsg_level").textContent = ae.getIntMsgLevel(i);
83
84
		document.getElementById("readmsg_from").className = (ae.getIntMsgFrom(i).length === 16) ? "mono" : "";
85
		document.getElementById("readmsg_to").className = (ae.getIntMsgTo(i).length === 16) ? "mono" : "";
86
	};
87
88
	// empty From1 cell
89
	row.insertCell(-1);
90
91
	cell = row.insertCell(-1);
92
	cell.textContent = ae.getIntMsgFrom(i);
93
	cell.className = (ae.getIntMsgFrom(i).length === 16) ? "mono" : "";
94
95
	cell = row.insertCell(-1);
96
	cell.textContent = ae.getIntMsgTo(i);
97
	cell.className = (ae.getIntMsgTo(i).length === 16) ? "mono" : "";
98
99
	cell = row.insertCell(-1);
100
	const el = document.createElement("input");
101
	el.className = "delMsg";
102
	el.type = "checkbox";
103
	el.setAttribute("data-id", ae.getIntMsgIdHex(i));
104
	el.onchange = function() {deleteButtonShow(this.checked);};
105
	cell.appendChild(el);
106
}
107
108
function addExtMessage(i) {
109
	const tbl = document.getElementById("tbd_inbox");
110
	const row = tbl.insertRow(-1);
111
112
	const ts = ae.getExtMsgTime(i);
113
	let cell = row.insertCell(-1);
114
	cell.setAttribute("data-ts", ts);
115
	cell.textContent = new Date(ts * 1000).toISOString().slice(0, 16).replace("T", " ");
116
	cell.className = "mono";
117
118
	cell = row.insertCell(-1);
119
	cell.textContent = ae.getExtMsgTitle(i);
120
	cell.onclick = function() {
121
		navMenu(-1);
122
		document.getElementById("div_readmsg").hidden = false;
123
		document.getElementById("readmsg_head").hidden = false;
124
		document.getElementById("readmsg_levelinfo").hidden = true;
125
		document.getElementById("readmsg_extmsg").hidden = false;
126
		document.getElementById("readmsg_greet").textContent = ae.getExtMsgGreet(i);
127
		document.getElementById("readmsg_tls").textContent = ae.getExtMsgTLS(i);
128
		document.getElementById("readmsg_ip").textContent = ae.getExtMsgIp(i);
129
130
		document.getElementById("readmsg_country").textContent = getCountryFlag(ae.getExtMsgCcode(i));
131
		document.getElementById("readmsg_country").title = ae.getExtMsgCname(i);
132
133
		const flags = document.getElementById("readmsg_flags").children;
134
		flags[0].hidden = ae.getExtMsgFlagPExt(i);
135
		flags[1].hidden = !ae.getExtMsgFlagRare(i);
136
		flags[2].hidden = !ae.getExtMsgFlagFail(i);
137
		flags[3].hidden = !ae.getExtMsgFlagPErr(i);
138
139
		document.getElementById("readmsg_title").textContent = ae.getExtMsgTitle(i);
140
		document.getElementById("readmsg_from").textContent = ae.getExtMsgEnvFrom(i);
141
		document.getElementById("readmsg_to").textContent = ae.getExtMsgEnvTo(i);
142
		document.getElementById("readmsg_body").innerHTML = ae.getExtMsgBody(i, false);
143
		document.getElementById("readmsg_headers").textContent = ae.getExtMsgHeaders(i);
144
145
		document.getElementById("readmsg_from").className = "";
146
		document.getElementById("readmsg_to").className = (ae.getExtMsgEnvTo(i).length === 16) ? "mono" : "";
147
	};
148
149
	const from = ae.getExtMsgHdrFrom(i);
150
	const from2 = from.substring(from.indexOf("@") + 1);
151
152
	cell = row.insertCell(-1);
153
	cell.textContent = from.substring(0, from.indexOf("@"));
154
155
	cell = row.insertCell(-1);
156
157
	let el = document.createElement("abbr");
158
	el.textContent = getCountryFlag(ae.getExtMsgCcode(i));
159
	el.title = ae.getExtMsgCname(i);
160
	cell.appendChild(el);
161
162
	el = document.createElement("span");
163
	el.textContent = " " + from2;
164
	cell.appendChild(el);
165
166
	cell = row.insertCell(-1);
167
	cell.textContent = ae.getExtMsgEnvTo(i);
168
	cell.className = (ae.getExtMsgEnvTo(i).length === 16) ? "mono" : "";
169
170
	cell = row.insertCell(-1);
171
	el = document.createElement("input");
172
	el.className = "delMsg";
173
	el.type = "checkbox";
174
	el.setAttribute("data-id", ae.getExtMsgIdHex(i));
175
	el.onchange = function() {deleteButtonShow(this.checked);};
176
	cell.appendChild(el);
177
}
178
179
function addMessages() {
180
	const maxExt = ae.getExtMsgCount();
181
	const maxInt = ae.getIntMsgCount();
182
183
	let numExt = 0;
184
	let numInt = 0;
185
186
	//TODO handle sent messages separately
187
188
	for (let i = 0; i < (page * 20) + 20; i++) {
189
		const tsInt = (numInt < maxInt) ? ae.getIntMsgTime(numInt) : 0;
190
		const tsExt = (numExt < maxExt) ? ae.getExtMsgTime(numExt) : 0;
191
		if (tsInt === 0 && tsExt === 0) break;
192
193
		if (tsInt !== 0 && (tsExt === 0 || tsInt > tsExt)) {
194
			if (i < (page * 20)) {
195
				numInt++;
196
				continue;
197
			}
198
199
			addIntMessage(numInt);
200
			numInt++;
201
		} else if (tsExt !== 0) {
202
			if (i < (page * 20)) {
203
				numExt++;
204
				continue;
205
			}
206
207
			addExtMessage(numExt);
208
			numExt++;
209
		}
210
	}
211
}
212
213
function addFile(num) {
214
	const table = document.getElementById("tbody_files");
215
	const row = table.insertRow(-1);
216
217
	let cell = row.insertCell(-1);
218
	cell.textContent = new Date(ae.getUplMsgTime(num) * 1000).toISOString().slice(0, 10);
219
220
	cell = row.insertCell(-1);
221
	cell.textContent = (ae.getUplMsgBytes(num) / 1024).toFixed(2);
222
223
	cell = row.insertCell(-1);
224
	cell.textContent = ae.getUplMsgTitle(num);
225
226
	cell = row.insertCell(-1);
227
	cell.innerHTML = "<button type=\"button\">D</button>";
228
	cell.children[0].onclick = function() {ae.downloadUplMsg(num);};
229
230
	cell = row.insertCell(-1);
231
	cell.innerHTML = "<button type=\"button\">X</button>";
232
	cell.children[0].onclick = function() {
233
		ae.Message_Delete([ae.getUplMsgIdHex(num)], function(error) {
234
			if (error === 0) {
235
				row.remove();
236
			} else {
237
				console.log("Failed deleting file");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
238
			}
239
		});
240
	};
241
}
242
243
function destroyAccount(upk_hex) {
244
	const tbl = document.getElementById("tbody_admin");
245
246
	let rowid = -1;
247
248
	for (let i = 0; i < tbl.rows.length; i++) {
249
		if (upk_hex === tbl.rows[i].cells[0].textContent) {
250
			rowid = i;
251
			break;
252
		}
253
	}
254
255
	if (rowid === -1) return;
256
257
	ae.Account_Delete(upk_hex, function(error) {
258
		if (error === 0) {
259
			tbl.deleteRow(rowid);
260
		} else {
261
			console.log("Failed to destroy account");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
262
		}
263
	});
264
}
265
266
function setAccountLevel(upk_hex, level) {
267
	const tbl = document.getElementById("tbody_admin");
268
269
	let rowid = -1;
270
271
	for (let i = 0; i < tbl.rows.length; i++) {
272
		if (tbl.rows[i].cells[0].textContent === upk_hex) {
273
			rowid = i;
274
			break;
275
		}
276
	}
277
278
	if (rowid === -1) return;
279
280
	ae.Account_Update(upk_hex, level, function(error) {
281
		if (error !== 0) {
282
			console.log("Failed to set account level");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
283
			return;
284
		}
285
286
		tbl.rows[rowid].cells[4].textContent = level;
287
288
		if (level === 0) {
289
			tbl.rows[rowid].cells[5].children[0].disabled = false;
290
			tbl.rows[rowid].cells[6].children[0].disabled = true;
291
		} else if (level === ae.getLevelMax()) {
292
			tbl.rows[rowid].cells[5].children[0].disabled = true;
293
			tbl.rows[rowid].cells[6].children[0].disabled = false;
294
		} else {
295
			tbl.rows[rowid].cells[5].children[0].disabled = false;
296
			tbl.rows[rowid].cells[6].children[0].disabled = false;
297
		}
298
299
		const pkHex = ae.admin_getUserPkHex(rowid);
300
		const currentLevel = ae.admin_getUserLevel(rowid);
301
		tbl.rows[rowid].cells[5].children[0].onclick = function() {setAccountLevel(pkHex, currentLevel + 1);};
302
		tbl.rows[rowid].cells[6].children[0].onclick = function() {setAccountLevel(pkHex, currentLevel - 1);};
303
	});
304
}
305
306
function deleteAddress(num) {
307
	if (num < 0) return;
308
309
	let btns = document.getElementById("tbody_opt_addr").getElementsByTagName("button");
310
	for (let i = 0; i < btns.length; i++) btns[i].disabled = true;
311
312
	ae.Address_Delete(num, function(error) {
313
		if (error !== 0) {
314
			console.log("Failed to delete address");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
315
			return;
316
		}
317
318
		document.getElementById("tbody_opt_addr").deleteRow(num);
319
		document.getElementById("send_from").remove(num);
320
321
		document.getElementById("addr_use_normal").textContent = ae.getAddressCountNormal();
322
		document.getElementById("addr_use_shield").textContent = ae.getAddressCountShield();
323
324
		if (ae.getAddressCountNormal() < ae.getLimitNormalA(ae.getOwnLevel())) document.getElementById("btn_newaddress").disabled = false;
325
		if (ae.getAddressCountShield() < ae.getLimitShieldA(ae.getOwnLevel())) document.getElementById("btn_newshieldaddress").disabled = false;
326
327
		ae.Private_Update(function(error2) {
328
			if (error2 !== 0) console.log("Failed to update the Private field");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
329
330
			btns = document.getElementById("tbody_opt_addr").getElementsByTagName("button");
331
			for (let i = 0; i < btns.length; i++) btns[i].disabled = false;
332
		});
333
	});
334
}
335
336
function addCellbox(row, checked) {
337
	let cell = row.insertCell(-1);
338
	let el = document.createElement("input");
339
	el.type = "checkbox";
340
	el.checked = checked;
341
	cell.appendChild(el);
342
}
343
344
function addAddress(num) {
345
	const addrTable = document.getElementById("tbody_opt_addr");
346
	const row = addrTable.insertRow(-1);
347
348
	let cell = row.insertCell(-1);
349
	cell.textContent = ae.getAddress(num);
350
	if (cell.textContent.length === 16) cell.className = "mono";
351
	cell.onclick = function() {navigator.clipboard.writeText(((this.textContent.length === 16) ? ae.shieldMix(this.textContent) : this.textContent) + "@" + ae.getDomainEml());};
352
353
	addCellbox(row, ae.getAddressAccExt(num));
354
	addCellbox(row, ae.getAddressAccInt(num));
355
	addCellbox(row, ae.getAddressAllVer(num));
356
	addCellbox(row, ae.getAddressAttach(num));
357
	addCellbox(row, ae.getAddressSecure(num));
358
	addCellbox(row, ae.getAddressOrigin(num));
359
360
	cell = row.insertCell(-1);
361
	let el = document.createElement("button");
362
	el.type = "button";
363
	el.textContent = "X";
364
	el.onclick = function() {deleteAddress(num);};
365
	cell.appendChild(el);
366
367
	el = document.createElement("option");
368
	el.value = ae.getAddress(num);
369
	el.textContent = ae.getAddress(num) + "@" + ae.getDomainEml();
370
	document.getElementById("send_from").appendChild(el);
371
}
372
373
function clearMessages() {
374
	document.getElementById("tbd_inbox").innerHTML = "";
375
	document.getElementById("tbd_snbox").innerHTML = "";
376
	document.getElementById("tbody_files").innerHTML = "";
377
}
378
379
function delMsgs(tblName, btnName) {
380
	const cbs = document.getElementsByClassName("delMsg");
381
	const ids = [];
382
383
	for (let i = 0; i < cbs.length; i++) {
384
		if (cbs[i].checked) ids.push(cbs[i].getAttribute("data-id"));
385
	}
386
387
	if (ids.length > 0) ae.Message_Delete(ids, function(error) {
388
		if (error === 0) {
389
			clearMessages();
390
			addMessages();
391
			document.getElementById(btnName).hidden = true;
392
		} else {
393
			console.log("Failed to delete messages");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
394
		}
395
	});
396
}
397
398
function deleteContact(email) {
399
	const tbl = document.getElementById("tbody_notes_contact");
400
	const rows = tbl.rows;
401
402
	for (let i = 0; i < rows.length; i++) {
403
		if (email === rows[i].cells[0].textContent) {
404
			ae.deleteContact(i);
405
			tbl.deleteRow(i);
406
			break;
407
		}
408
	}
409
410
	document.getElementById("btn_savenotes").hidden = false;
411
}
412
413
function addContactToTable(mail, name, note) {
414
	const contactTable = document.getElementById("tbody_notes_contact");
415
	const row = contactTable.insertRow(-1);
416
	const cellMail = row.insertCell(-1);
417
	const cellName = row.insertCell(-1);
418
	const cellNote = row.insertCell(-1);
419
	const cellBtnD = row.insertCell(-1);
420
421
	cellMail.className = "left";
422
	cellName.className = "left";
423
	cellNote.className = "left";
424
425
	cellMail.textContent = mail;
426
	cellName.textContent = name;
427
	cellNote.textContent = note;
428
	cellBtnD.innerHTML = "<button type=\"button\">X</button>";
429
430
	cellBtnD.onclick = function() {deleteContact(mail);};
431
}
432
433
function addRowAdmin(num) {
434
	const table = document.getElementById("tbody_admin");
435
436
	const row = table.insertRow(-1);
437
	const cellPk = row.insertCell(-1);
438
	const cellMb = row.insertCell(-1);
439
	const cellNa = row.insertCell(-1);
440
	const cellSa = row.insertCell(-1);
441
	const cellLv = row.insertCell(-1);
442
	const cellBtnPl = row.insertCell(-1);
443
	const cellBtnMn = row.insertCell(-1);
444
	const cellBtnDe = row.insertCell(-1);
445
446
	cellPk.textContent = ae.admin_getUserPkHex(num);
447
	cellMb.textContent = ae.admin_getUserSpace(num);
448
	cellNa.textContent = ae.admin_getUserNAddr(num);
449
	cellSa.textContent = ae.admin_getUserSAddr(num);
450
	cellLv.textContent = ae.admin_getUserLevel(num);
451
	cellBtnPl.innerHTML = "<button type=\"button\">+</button>";
452
	cellBtnMn.innerHTML = "<button type=\"button\">-</button>";
453
	cellBtnDe.innerHTML = "<button type=\"button\">X</button>";
454
455
	cellPk.className = "mono";
456
	if (ae.admin_getUserLevel(num) === ae.getLevelMax()) cellBtnPl.children[0].disabled = true;
457
	if (ae.admin_getUserLevel(num) === 0) cellBtnMn.children[0].disabled = true;
458
459
	const pkHex = ae.admin_getUserPkHex(num);
460
	const currentLevel = ae.admin_getUserLevel(num);
461
	cellBtnPl.children[0].onclick = function() {setAccountLevel(pkHex, currentLevel + 1);};
462
	cellBtnMn.children[0].onclick = function() {setAccountLevel(pkHex, currentLevel - 1);};
463
	cellBtnDe.children[0].onclick = function() {destroyAccount(pkHex);};
464
}
465
466
function reloadInterface() {
467
	if (!ae.isUserAdmin()) document.getElementById("btn_toadmin").hidden = true;
468
	document.getElementById("div_begin").hidden = true;
469
	document.getElementById("div_allears").hidden = false;
470
471
	clearMessages();
472
	document.getElementById("tbody_admin").innerHTML = "";
473
	document.getElementById("tbody_files").innerHTML = "";
474
	document.getElementById("tbody_notes_contact").innerHTML = "";
475
	document.getElementById("tbody_opt_addr").innerHTML = "";
476
477
	// Contacts
478
	for (let i = 0; i < ae.getContactCount(); i++) {
479
		addContactToTable(
480
			ae.getContactMail(i),
481
			ae.getContactName(i),
482
			ae.getContactNote(i)
483
		);
484
	}
485
486
	// Addresses
487
	for (let i = 0; i < ae.getAddressCount(); i++) {
488
		addAddress(i);
489
	}
490
491
	document.getElementById("addr_use_normal").textContent = ae.getAddressCountNormal();
492
	document.getElementById("addr_use_shield").textContent = ae.getAddressCountShield();
493
	document.getElementById("addr_max_normal").textContent = ae.getLimitNormalA(ae.getOwnLevel());
494
	document.getElementById("addr_max_shield").textContent = ae.getLimitShieldA(ae.getOwnLevel());
495
496
	if (ae.getAddressCountNormal() >= ae.getLimitNormalA(ae.getOwnLevel())) document.getElementById("btn_newaddress").disabled = true;
497
	if (ae.getAddressCountShield() >= ae.getLimitShieldA(ae.getOwnLevel())) document.getElementById("btn_newshieldaddress").disabled = true;
498
499
	if (ae.isUserAdmin()) {
500
		const tblLimits = document.getElementById("tbl_limits");
501
		for (let i = 0; i < 4; i++) {
502
			tblLimits.rows[i].cells[1].children[0].value = ae.getStorageLimit(i);
503
			tblLimits.rows[i].cells[2].children[0].value = ae.getLimitNormalA(i);
504
			tblLimits.rows[i].cells[3].children[0].value = ae.getLimitShieldA(i);
505
		}
506
507
		document.getElementById("btn_admin_savelimits").onclick = function() {
508
			const storageLimit = [];
509
			const addrNrmLimit = [];
510
			const addrShdLimit = [];
511
512
			for (let i = 0; i < 4; i++) {
513
				storageLimit[i] = tblLimits.rows[i].cells[1].children[0].value;
514
				addrNrmLimit[i] = tblLimits.rows[i].cells[2].children[0].value;
515
				addrShdLimit[i] = tblLimits.rows[i].cells[3].children[0].value;
516
			}
517
518
			ae.setLimits(storageLimit, addrNrmLimit, addrShdLimit, function(error) {
519
				if (error !== 0) {
520
					console.log("Failed to update limits");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
521
				}
522
			});
523
		};
524
525
		for (let i = 0; i < ae.admin_getUserCount(); i++) {
526
			addRowAdmin(i);
527
		}
528
	}
529
}
530
531
document.getElementById("btn_inbox_prev").onclick = function() {
532
	if (page > 0) {
533
		page--;
534
		clearMessages();
535
		addMessages();
536
		this.disabled = (page === 0);
537
	}
538
};
539
540
document.getElementById("btn_inbox_next").onclick = function() {
541
// TODO: Check if page too high
542
//	if (page > 0) {
543
		page++;
544
		clearMessages();
545
		addMessages();
546
		document.getElementById("btn_inbox_prev").disabled = false;
547
//	}
548
};
549
550
document.getElementById("btn_enter").onclick = function() {
551
	const txtSkey = document.getElementById("txt_skey");
552
	if (!txtSkey.reportValidity()) return;
553
554
	const btn = this;
555
	btn.disabled = true;
556
557
	ae.setKeys(txtSkey.value, function(success) {
558
		if (!success) {
559
			document.getElementById("begin_message").hidden = false;
560
			document.getElementById("begin_message").textContent = "Error: Invalid key format";
561
			btn.disabled = false;
562
			return;
563
		}
564
565
		ae.Message_Browse(false, true, function(statusBrowse) {
566
			if (statusBrowse !== 0) {
567
				document.getElementById("begin_message").hidden = false;
568
				document.getElementById("begin_message").textContent = "Error: " + ae.getErrorMessage(statusBrowse);
569
				btn.disabled = false;
570
				return;
571
			}
572
573
			txtSkey.value = "";
574
			reloadInterface();
575
			document.getElementById("btn_refresh").click();
576
		});
577
	});
578
};
579
580
document.getElementById("btn_refresh").onclick = function() {
581
	const btn = this;
582
	btn.disabled = true;
583
584
	ae.Message_Browse(true, false, function(error) {
585
		if (error === 0) {
586
			clearMessages();
587
			addMessages();
588
			for (let i = ae.getUplMsgCount() - 1; i >= 0; i--) {addFile(i);}
589
		} else {
590
			console.log("Failed to refresh");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
591
		}
592
593
		btn.disabled = false;
594
	});
595
};
596
597
document.getElementById("btn_contact_add").onclick = function() {
598
	const txtMail = document.getElementById("txt_newcontact_mail");
599
	const txtName = document.getElementById("txt_newcontact_name");
600
	const txtNote = document.getElementById("txt_newcontact_note");
601
602
	addContactToTable(txtMail.value, txtName.value, txtNote.value);
603
	ae.addContact(txtMail.value, txtName.value, txtNote.value);
604
605
	txtMail.value = "";
606
	txtName.value = "";
607
	txtNote.value = "";
608
609
	document.getElementById("btn_savenotes").hidden = false;
610
};
611
612
document.getElementById("btn_savenotes").onclick = function() {
613
	ae.Private_Update(function(error) {
614
		if (error === 0) {
615
			document.getElementById("btn_savenotes").hidden = true;
616
		} else {
617
			console.log("Failed to save note data");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
618
		}
619
	});
620
};
621
622
document.getElementById("btn_msgdel").onclick = function() {
623
	delMsgs("tbody_inbox", "btn_msgdel");
624
};
625
626
document.getElementById("btn_sentdel").onclick = function() {
627
	delMsgs("tbody_sentbox", "btn_sentdel");
628
};
629
630
document.getElementById("btn_send").onclick = function() {
631
	const btn = this;
632
	btn.disabled = true;
633
634
	const sfrom = document.getElementById("send_from");
635
	const stitle = document.getElementById("send_title");
636
	const sto = document.getElementById("send_to");
637
	const sbody = document.getElementById("send_body");
638
639
	if (!stitle.reportValidity() || !sto.reportValidity() || !sbody.reportValidity()) return;
640
641
	ae.Message_Create(stitle.value, sbody.value, sfrom.value, sto.value, null, function(error) {
642
		if (error === 0) {
643
			stitle.value = "";
644
			sto.value = "";
645
			sbody.value = "";
646
		} else {
647
			console.log("Failed sending message");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
648
		}
649
650
		btn.disabled = false;
651
	});
652
};
653
654
document.getElementById("btn_newaddress").onclick = function() {
655
	if (ae.getAddressCountNormal() >= ae.getLimitNormalA(ae.getOwnLevel())) return;
656
657
	const txtNewAddr = document.getElementById("txt_newaddress");
658
	if (!txtNewAddr.reportValidity()) return;
659
660
	const btnN = document.getElementById("btn_newaddress");
661
	const btnS = document.getElementById("btn_newshieldaddress");
662
	btnN.disabled = true;
663
	btnS.disabled = true;
664
665
	ae.Address_Create(txtNewAddr.value, function(error1) {
666
		if (error1 === 0) {
667
			ae.Private_Update(function(error2) {
668
				document.getElementById("addr_use_normal").textContent = ae.getAddressCountNormal();
669
				addAddress(ae.getAddressCount() - 1);
670
				txtNewAddr.value = "";
671
672
				if (error2 !== 0) console.log("Failed to update the Private field");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
673
				if (ae.getAddressCountNormal() < ae.getLimitNormalA(ae.getOwnLevel())) btnN.disabled = false;
674
				if (ae.getAddressCountShield() < ae.getLimitShieldA(ae.getOwnLevel())) btnS.disabled = false;
675
			});
676
		} else {
677
			console.log("Failed to add address");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
678
			if (ae.getAddressCountNormal() < ae.getLimitNormalA(ae.getOwnLevel())) btnN.disabled = false;
679
			if (ae.getAddressCountShield() < ae.getLimitShieldA(ae.getOwnLevel())) btnS.disabled = false;
680
		}
681
	});
682
};
683
684
document.getElementById("btn_newshieldaddress").onclick = function() {
685
	if (ae.getLimitShieldA() >= ae.getLimitShieldA(ae.getOwnLevel())) return;
686
687
	const btnN = document.getElementById("btn_newaddress");
688
	const btnS = document.getElementById("btn_newshieldaddress");
689
	btnN.disabled = true;
690
	btnS.disabled = true;
691
692
	ae.Address_Create("SHIELD", function(error1) {
693
		if (error1 !== 0) {
694
			console.log("Failed to add Shield address");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
695
			if (ae.getAddressCountNormal() < ae.getLimitNormalA(ae.getOwnLevel())) btnN.disabled = false;
696
			if (ae.getAddressCountShield() < ae.getLimitShieldA(ae.getOwnLevel())) btnS.disabled = false;
697
			return;
698
		}
699
700
		ae.Private_Update(function(error2) {
701
			document.getElementById("addr_use_shield").textContent = ae.getAddressCountShield();
702
			addAddress(ae.getAddressCount() - 1);
703
704
			if (error2 !== 0) console.log("Failed to update the Private field");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
705
			if (ae.getAddressCountNormal() < ae.getLimitNormalA(ae.getOwnLevel())) btnN.disabled = false;
706
			if (ae.getAddressCountShield() < ae.getLimitShieldA(ae.getOwnLevel())) btnS.disabled = false;
707
		});
708
	});
709
};
710
711
document.getElementById("btn_saveaddrdata").onclick = function() {
712
	const tbl = document.getElementById("tbody_opt_addr");
713
714
	for (let i = 0; i < tbl.rows.length; i++) {
715
		ae.setAddressAccExt(i, tbl.rows[i].cells[1].firstChild.checked);
716
		ae.setAddressAccInt(i, tbl.rows[i].cells[2].firstChild.checked);
717
	}
718
719
	ae.Address_Update(function(error) {
720
		if (error === 0) {
721
			document.getElementById("btn_saveaddrdata").hidden = true;
722
		} else {
723
			console.log("Failed to save address data");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
724
		}
725
	});
726
};
727
728
document.getElementById("btn_admin_addaccount").onclick = function() {
729
	const txtPkey = document.getElementById("txt_newacc_pkey");
730
731
	if (!txtPkey.reportValidity()) return;
732
733
	const btn = document.getElementById("btn_admin_addaccount");
734
	btn.disabled = true;
735
736
	ae.Account_Create(txtPkey.value, function(error) {
737
		if (error === 0) {
738
			addRowAdmin(ae.admin_getUserCount() - 1);
739
			txtPkey.value = "";
740
		} else {
741
			console.log("Failed to add account");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
742
		}
743
	});
744
745
	btn.disabled = false;
746
};
747
748
document.getElementById("upfile").onchange = function() {
749
	const fn = this.files[0].name;
750
	const reader = new FileReader();
751
752
	reader.onload = function() {
753
		ae.Message_Upload(fn, new Uint8Array(reader.result), function(error) {
754
			if (error === 0) {
755
				addFile(0);
756
				document.getElementById("upfile").value = "";
757
			} else {
758
				console.log("Failed to upload file");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
759
			}
760
		});
761
	};
762
763
	reader.readAsArrayBuffer(this.files[0]);
764
};
765
766
function navNotesMenu(num) {
767
	for (let i = 0; i < 3; i++) {
768
		const isCurrent = (i === num);
769
		document.getElementById("div_notes").children[0].children[i].disabled = isCurrent;
770
		document.getElementById("div_notes").children[1 + i].hidden = !isCurrent;
771
	}
772
}
773
774
let btns = document.getElementsByTagName("nav")[0].getElementsByTagName("button");
775
btns[0].onclick = function() {navMenu(0);};
776
btns[1].onclick = function() {navMenu(1);};
777
btns[2].onclick = function() {navMenu(2);};
778
btns[3].onclick = function() {navMenu(3);};
779
btns[4].onclick = function() {navMenu(4);};
780
781
btns = document.getElementById("div_notes").getElementsByTagName("button");
782
btns[0].onclick = function() {navNotesMenu(0);};
783
btns[1].onclick = function() {navNotesMenu(1);};
784
btns[2].onclick = function() {navNotesMenu(2);};
785
786
document.getElementById("txt_skey").onkeyup = function(e) {
787
	if (e.key === "Enter") document.getElementById("btn_enter").click();
788
};
789
790
navMenu(0);
791
792
});
793